import Common from '../common/common.js';
const common = new Common;
//分页对象
var PAGINATE = {
  //data里的数据会同步到页面上去
  data: {
    
  }, 
  //分页查询配置
  config: {
    //分页对象是否已经初始化
    inited: false,
    //是否在异步请求数据，请求中需要阻止新请求 
    loading: false,
    //是否有数据
    hasData: true,
    //首次加载是否有数据
    firstHasData: true,
    //第几页 
    pageNum: 1,
    //每页多少条数据 
    pageSize: 10,
    //这里注册的参数都会同步到页面上去
    syncParams: ['hasData', 'firstHasData', 'pageNum']
  }, 
  //多列表分页查询配置
  configMulti: {
    //分页对象是否已经初始化
    inited: false,
    //当前标签页序号
    currentTab: 0,
    //是否在异步请求数据，请求中需要阻止新请求 
    loadingArray: Array(10).fill(false),
    //是否有数据
    hasDataArray: Array(10).fill(true),
    //首次加载是否有数据
    firstHasDataArray: Array(10).fill(true),
    //第几页 
    pageNumArray: Array(10).fill(1),
    //每页多少条数据 
    pageSizeArray: Array(10).fill(10),
    //标签页是否加载过
    tabLoadedArray: Array(10).fill(false),
    //这里注册的参数都会同步到页面上去
    syncParams: ['hasDataArray', 'firstHasDataArray', 'pageNumArray', 'tabLoadedArray']
  },
  /**
   * 初始化
   * 参数conf可为null，模板参照this.config
   */
  init: function (conf) {
    //设置已经初始化
    this.config.inited = true;
    //合并参数
    if (conf != null) {
      Object.assign(this.config, conf);
    }
    //初始化-基础
    this.initBase();
  },
  /**
   * 初始化-多标签页列表
   * 参数conf可为null，模板参照this.configMulti
   */
  initMulti: function (conf) {
    //设置已经初始化
    this.configMulti.inited = true;
    //合并参数
    if (conf != null) {
      Object.assign(this.configMulti, conf);
    }
    //初始化-基础
    this.initBase();
  },
  /**
   * 初始化-基础
   * 1.扩展原生事件onPullDownRefresh和onReachBottom
   * 2.赋值需要同步到页面的参数并同步到页面
   */
  initBase: function () {
    //原生Page对象
    var originalPage = getCurrentPages()[getCurrentPages().length - 1];
    //扩展原生事件函数
    this.extendsMethod(originalPage, 'onPullDownRefresh', function (res) {
      console.log('onPullDownRefresh');
      PAGINATE.onPullDownRefresh();
    });
    this.extendsMethod(originalPage, 'onReachBottom', function (res) {
      console.log('onReachBottom');
      PAGINATE.onReachBottom();
    });
    //赋值需要同步到页面的参数并同步到页面
    this.writeToPage();
  },
  /**
   * 扩展原生事件函数增加回调
   */
  extendsMethod: function (conf, method, callback) {
    //原生事件函数
    const originalMethod = conf[method];
    //新事件函数
    conf[method] = function (res) {
      //增加回调
      if (callback != null && typeof callback === 'function') {
        callback(res);
      }
      //改变原生事件函数里的this指向,指向新事件函数
      if (typeof originalMethod === 'function') {
        originalMethod.call(this, res);
      }
    }
  },
  /**
   * 赋值需要同步到页面的参数并同步到页面
   */
  writeToPage: function () {
    //赋值需要同步到页面的参数
    if (this.config.inited) {
      this.config.syncParams.forEach((val, index) => {
        this.data[val] = this.config[val];
      });
    }
    if (this.configMulti.inited) {
      this.configMulti.syncParams.forEach((val, index) => {
        this.data[val] = this.configMulti[val];
      });
    }
    //将data对象同步到页面中去
    this.setData(this.data);
  },
  /**
   * 设置参数值并调用页面的setData同步到页面
   */
  setData: function (data) {
    //原生Page对象
    var originalPage = getCurrentPages()[getCurrentPages().length - 1];
    originalPage.setData(data);
  },
  /**
   * 异步请求-带分页
   * url:api链接
   * type:请求类型
   * data:请求参数
   */
  requestAjaxByPage(url, type, data) {
    if (!this.config.inited && !this.configMulti.inited) {
      common.showToast("请先在onload中调用PAGENATE.init()或PAGENATE.initMulti()");
      return;
    }
    var dataWrap = null;
    if (this.config.inited){
      dataWrap = {
        "size": this.config.pageSize,
        "current": this.config.pageNum,
        "condition": data
      };
    }
    if (this.configMulti.inited) {
      //从页面同步currentTab到本地
      this.syncCurrentTab();
      dataWrap = {
        "size": this.configMulti.pageSizeArray[this.configMulti.currentTab],
        "current": this.configMulti.pageNumArray[this.configMulti.currentTab],
        "condition": data
      };
      //该标签页加载过数据
      if (this.configMulti.pageNumArray[this.configMulti.currentTab] == 1) {
        this.configMulti.tabLoadedArray[this.configMulti.currentTab] = true;
      }
    }
    return new Promise((resolve, reject) => {
      common.requestAjax(url, type, dataWrap).then(res => {
        //加载完成，重置下 
        this.resetPaginate();
        //接口报错
        if (res.data.code != 1) {
          common.showToast(res.data.message);
          return;
        }
        //处理分页的后续操作
        this.handlePaginate(res);
        //执行业务部分
        resolve(res);
      }).catch(err => {
        reject(err);
        //失败也要重置 
        this.resetPaginate();
      })
    })
  },
  /** 
   * 从页面同步currentTab到本地
   */
  syncCurrentTab: function () {
    //原生Page对象
    var originalPage = getCurrentPages()[getCurrentPages().length - 1];
    this.configMulti.currentTab = originalPage.data.currentTab;
  },
  /** 
   * 重置分页 
   */
  resetPaginate: function () {
    //标识设置加载完成 
    if (this.config.inited) {
      this.config.loading = false;
    }
    if (this.configMulti.inited) {
      this.configMulti.loadingArray[this.configMulti.currentTab] = false;
    }
    //隐藏导航栏loading 
    wx.hideNavigationBarLoading();
  },
  /**
   * 处理分页的后续操作
   */
  handlePaginate: function (res) {
    //判断有没有数据，设置hasData和firstHasData供页面提示使用
    var hasData = true;
    if (res.data.records == null || res.data.records.length == 0) {
      hasData = false;
    }
    if (this.config.inited) {
      this.config.hasData = hasData;
      //有数据得页码+1
      if (hasData) {
        this.config.pageNum++;
      } else {
        if (this.config.pageNum == 1) {
          this.config.firstHasData = false;
        }
      }
    }
    if (this.configMulti.inited) {
      this.configMulti.hasDataArray[this.configMulti.currentTab] = hasData;
      //有数据得页码+1
      if (hasData) {
        //页码+1 
        this.configMulti.pageNumArray[this.configMulti.currentTab]++;
      } else {
        if (this.configMulti.pageNumArray[this.configMulti.currentTab] == 1) {
          this.configMulti.firstHasDataArray[this.configMulti.currentTab] = false;
        }
      }
    }
    //赋值需要同步到页面的参数并同步到页面
    this.writeToPage();
  },
  /** 
   * 页面相关事件处理函数--监听用户下拉动作 
   */
  onPullDownRefresh: function () {
    //页码置1
    if (this.config.inited) {
      this.config.pageNum = 1;
    }
    if (this.configMulti.inited) {
      this.configMulti.pageNumArray[this.configMulti.currentTab] = 1;
    }
    //关闭下拉动作 
    setTimeout(function () {
      wx.stopPullDownRefresh();
    }, 10)
    //同onReachBottom
    this.onReachBottom();
  },
  /** 
   * 页面上拉触底事件的处理函数 
   */
  onReachBottom: function () {
    //正在加载中阻止再次查询 
    if (this.config.inited) {
      if (this.config.loading) {
        return;
      }
      //标识设置成加载中
      this.config.loading = true;
    }
    if (this.configMulti.inited) {
      if (this.configMulti.loadingArray[this.configMulti.currentTab]) {
        return;
      }
      //标识设置成加载中
      this.configMulti.loadingArray[this.configMulti.currentTab] = true;
    }
    //显示导航栏loading 
    wx.showNavigationBarLoading();
  }
};
module.exports = PAGINATE